import flixel.ui.FlxButton;
import flixel.FlxG;
import flixel.util.FlxPath;
import flixel.util.FlxSave;
import flixel.FlxSprite;
import flixel.FlxObject;
import flixel.FlxState;
import flixel.FlxSubState;
import flixel.FlxCamera;
import flixel.group.FlxGroup;
import flixel.FlxBasic;
import flixel.text.FlxText;
import flixel.tile.FlxTilemap;
import haxe.xml.Fast;
import flixel.util.FlxPoint;
import actions.ActionContainer;
import actions.ActionBase;
import actions.SimpleAction;
import actions.IterableContainer;
import actions.ActionSource;
import flixel.tweens.FlxTween;
import flixel.tweens.FlxEase;

class CodeState extends FlxSubState
{
	public var draggedBlock: ActionBase;
	public var baseContainer: IterableContainer;
	public var actionSource: ActionSource;
	public var m_isIterating: Bool = false;


	public function new(container: IterableContainer, source: ActionSource){
		super(0xaaaaaaaa);
		draggedBlock = null;
		this.bgColor = 0xaaaaaaaa;

		baseContainer = container;
		baseContainer.setPosition(FlxG.camera.scroll.x+20, FlxG.camera.scroll.y+50);
		actionSource = source;
		actionSource.setPosition(FlxG.camera.scroll.x + 200, FlxG.camera.scroll.y + 50);
		
		add(baseContainer);
		add(actionSource);
		FlxG.mouse.visible = true;
	}
	
	override public function update(){
		
		super.update();
		if(FlxG.keys.justPressed.T){
			cast(_parentState, PlayState).receivesInput = true;
			close();
		}


		// si se hizo click,
		//		intentar hacer pick en alguno de los contenedores
		if(FlxG.mouse.justPressed){
			var pos = FlxG.mouse.getWorldPosition();
			draggedBlock = baseContainer.pick(pos); 
			if(draggedBlock != null){
				//avisa al otro contenedor cuál es la acción que se arrastra
				actionSource.setFloatingAction(draggedBlock);
			}else{
				draggedBlock = actionSource.pick(pos);
				if(draggedBlock != null){
					// avisa al otro contenedor cuál es la acción que se arrastra
					baseContainer.setFloatingAction(draggedBlock);
				}
			}
		}

		// si hay algo arrastrándose (referencia a la Acción arrastrada)
		// 		si ese algo arrastrable colisiona con algún contenedor
		if (draggedBlock != null){
			// ajusta la posición del bloque arrastrado para que su centro coincida con el mouse
			var pos = FlxG.mouse.getWorldPosition();
			draggedBlock.x = pos.x - draggedBlock.width/2.0; 
			draggedBlock.y = pos.y - draggedBlock.height/2.0;

			// maneja los placeholders
			if (baseContainer.overlap(draggedBlock)){
				baseContainer.putPlaceholder();
			}else{
				baseContainer.removePlaceholder();
			}
		}

		
		// si se soltó el mouse
		// 		si la acción arrastrada no colisiona con nada
		//			devolver la acción arrastrada al contenedor de origen
		//		si la acción arrastrada colisiona con algo
		//			si ese algo es el contenedor de origen
		//				devolver al contenedor de origen
		//			si ese algo es el nuevo contenedor
		//				posicionar en el nuevo contenedor 
		if(FlxG.mouse.justReleased && draggedBlock != null){
			// si puede soltarlo en el contenedor, lo suelta allí
			
			// UN CONCEPTO IMPORTANTE ACA ES QUIEN TOMA POSESION DEL FLOATING
			// ACTION PARA DIBUJARLA, MIENTRAS SE ARRASTRA: CodeState, CUANDO ESTA
			// HACIENDO TWEENING HACIA UN CONTENEDOR: EL CONTENEDOR (O SOURCE)
			if(baseContainer.drop())
			{
				actionSource.setFloatingAction(null);
			}
			else
			{
				// sino, lo devuelve al source
				actionSource.drop();
			}
			/*var droppedInContainer = baseContainer.drop();
			var droppedInSource = actionSource.drop();
			if(!droppedInContainer && !droppedInSource){
				trace("se solto en el vacio");
				// TODO: hacer que ésto funcione bien!!!
				draggedBlock.x = actionSource.x;
				draggedBlock.y = actionSource.y;
				actionSource.setFloatingAction(draggedBlock);
				actionSource.drop();
			}*/
			
			draggedBlock = null;
			//baseContainer.dropBlock();
		}
	}

	public override function destroy(){
	
	}

	public override function draw()
	{
		super.draw();
		if(draggedBlock != null)
		{
			draggedBlock.draw();
		}
	}
	
}